package com.reactim.message.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.CompoundIndexes;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 消息实体类 - MongoDB文档
 */
@Data
@Document(collection = "messages")
@CompoundIndexes({
    @CompoundIndex(name = "from_user_time_idx", def = "{'fromUserId': 1, 'createdAt': -1}"),
    @CompoundIndex(name = "to_user_time_idx", def = "{'toUserId': 1, 'createdAt': -1}"),
    @CompoundIndex(name = "group_time_idx", def = "{'groupId': 1, 'createdAt': -1}"),
    @CompoundIndex(name = "conversation_time_idx", def = "{'conversationId': 1, 'createdAt': -1}")
})
public class Message {
    
    @Id
    private String id;
    
    @Indexed(unique = true)
    private String messageId;           // 消息唯一ID
    
    @Indexed
    private Long fromUserId;            // 发送者ID
    
    @Indexed
    private Long toUserId;              // 接收者ID（单聊）
    
    @Indexed
    private Long groupId;               // 群组ID（群聊）
    
    @Indexed
    private String conversationId;      // 会话ID（用于消息分组）
    
    private MessageType messageType;    // 消息类型
    
    private MessageContent content;     // 消息内容
    
    private MessageExtra extra;         // 扩展信息
    
    private MessageStatus status;       // 消息状态
    
    @Indexed
    private LocalDateTime createdAt;    // 创建时间
    
    private LocalDateTime updatedAt;    // 更新时间
    
    @Indexed
    private Long sequence;              // 消息序号
    
    /**
     * 消息类型枚举
     */
    public enum MessageType {
        TEXT,           // 文本消息
        IMAGE,          // 图片消息
        VOICE,          // 语音消息
        VIDEO,          // 视频消息
        FILE,           // 文件消息
        LOCATION,       // 位置消息
        EMOJI,          // 表情消息
        CONTACT,        // 联系人消息
        URL_CARD,       // URL卡片消息
        REPLY,          // 引用回复消息
        FORWARD,        // 转发消息
        SYSTEM          // 系统消息
    }
    
    /**
     * 消息状态枚举
     */
    public enum MessageStatus {
        NORMAL,         // 正常
        RECALLED,       // 已撤回
        DELETED,        // 已删除
        EDITED          // 已编辑
    }
    
    /**
     * 消息内容
     */
    @Data
    public static class MessageContent {
        private TextContent text;           // 文本内容
        private MediaContent media;         // 媒体内容
        private LocationContent location;   // 位置内容
        private ContactContent contact;     // 联系人内容
        private UrlCardContent urlCard;     // URL卡片内容
        private SystemContent system;       // 系统消息内容
    }
    
    /**
     * 文本消息内容
     */
    @Data
    public static class TextContent {
        private String text;                // 文本内容
        private List<Long> mentions;        // @提及的用户ID
        private List<String> hashtags;      // 话题标签
        private TextFormat format;          // 文本格式
    }
    
    /**
     * 文本格式
     */
    @Data
    public static class TextFormat {
        private Boolean bold;               // 粗体
        private Boolean italic;             // 斜体
        private Boolean underline;          // 下划线
        private String color;               // 文字颜色
    }
    
    /**
     * 媒体消息内容
     */
    @Data
    public static class MediaContent {
        private String url;                 // 媒体URL
        private String thumbnailUrl;        // 缩略图URL
        private String fileName;            // 文件名
        private Long fileSize;              // 文件大小
        private Integer width;              // 宽度
        private Integer height;             // 高度
        private Integer duration;           // 时长
        private String mimeType;            // MIME类型
        private String hash;                // 文件哈希
    }
    
    /**
     * 位置消息内容
     */
    @Data
    public static class LocationContent {
        private Double latitude;            // 纬度
        private Double longitude;           // 经度
        private String address;             // 地址描述
        private String poiName;             // POI名称
    }
    
    /**
     * 联系人消息内容
     */
    @Data
    public static class ContactContent {
        private Long userId;                // 用户ID
        private String nickname;            // 昵称
        private String avatarUrl;           // 头像URL
        private String phone;               // 电话号码
    }
    
    /**
     * URL卡片消息内容
     */
    @Data
    public static class UrlCardContent {
        private String url;                 // 链接URL
        private String title;               // 标题
        private String description;         // 描述
        private String imageUrl;            // 预览图URL
        private String siteName;            // 网站名称
    }
    
    /**
     * 系统消息内容
     */
    @Data
    public static class SystemContent {
        private SystemMessageType type;     // 系统消息类型
        private String content;             // 消息内容
        private List<Long> relatedUsers;    // 相关用户ID
    }
    
    /**
     * 系统消息类型
     */
    public enum SystemMessageType {
        USER_JOIN,          // 用户加入
        USER_LEAVE,         // 用户离开
        GROUP_CREATE,       // 群组创建
        GROUP_DISMISS,      // 群组解散
        ADMIN_CHANGE,       // 管理员变更
        GROUP_INFO_UPDATE   // 群信息更新
    }
    
    /**
     * 消息扩展信息
     */
    @Data
    public static class MessageExtra {
        private String replyToMessageId;    // 回复的消息ID
        private List<ForwardInfo> forwards; // 转发信息
        private EditInfo editInfo;          // 编辑信息
        private Map<String, String> customData; // 自定义数据
    }
    
    /**
     * 转发信息
     */
    @Data
    public static class ForwardInfo {
        private String originalMessageId;   // 原始消息ID
        private Long originalSenderId;      // 原始发送者ID
        private LocalDateTime forwardTimestamp; // 转发时间戳
    }
    
    /**
     * 编辑信息
     */
    @Data
    public static class EditInfo {
        private LocalDateTime editTimestamp; // 编辑时间戳
        private String originalContent;     // 原始内容
        private Integer editCount;          // 编辑次数
    }
}